// 错误信息记录到日志管理系统，只在生产环境使用
import { statusMap, isProd } from "../utils/constant";
export function setBeginTime(config) {
  config.beginTime = new Date().getTime();
  return config;
}
function track(config) {
  if (!isProd()) {
    console.log(config);
  }
  window._dzPoint && window._dzPoint.push(config);
}
export default (type) => (params) => {
  // 非生产环境跳过这个拦截器
  if (!isProd()) {
    if (type === "resolve") {
      return params;
    } else if (type === "reject") {
      return Promise.reject(params);
    }
  }
  let res = params;
  // 先处理跨域或服务不存在的问题
  if (params.code === "ERR_NETWORK") {
    track({
      t: "requestCodeError",
      rc: statusMap.DEFAULTERROR,
      rt: 1, // 接口耗时
      ru: params.config.url,
      ec: statusMap.DEFAULTERROR,
      em: "接口跨域，或其他系统问题",
      c: JSON.stringify({
        method: "POST", // 请求方式
        data: {}, // 请求参数
        params: {},
      }),
    });
  } else {
    let httpCode = 200;
    let resultCode = 200;
    if (type === "resolve") {
      resultCode = res.data.code || statusMap.DEFAULTERROR;
    } else if (type === "reject") {
      httpCode = res ? res.status : statusMap.INTERNAL_SERVER_ERROR;
    }
    if (res) {
      const rt =
        type === "resolve" ? new Date().getTime() - res.config.beginTime : 0; // 接口耗时
      if (httpCode === statusMap.SUCCESS && !res.data) {
        // 没有返回结果
        track({
          t: "requestCodeError",
          rc: httpCode, // 请求状态码
          rt, // 接口耗时
          ru: res.config.url, // 请求的地址
          ec: resultCode, // 后端返回的code
          em: "接口没有返回数据", // 后端返回的错误信息
          c: JSON.stringify({
            method: res.config.method, // 请求方式
            data: res.config.data, // 请求body
            params: res.config.params, // 请求参数
          }),
        });
      } else if (
        resultCode === statusMap.SUCCESS &&
        res.data &&
        "result" in res.data === false
      ) {
        // 返回结果里面没有 result 字段
        track({
          t: "requestCodeError",
          rc: httpCode, // 请求状态码
          rt, // 接口耗时
          ru: res.config.url, // 请求的地址
          ec: resultCode, // 后端返回的code
          em: "接口没有返回result字段", // 后端返回的错误信息
          c: JSON.stringify({
            method: res.config.method, // 请求方式
            data: res.config.data, // 请求body
            params: res.config.params, // 请求参数
          }),
        });
      } else if (
        resultCode !== statusMap.SUCCESS &&
        resultCode !== statusMap.NOTLOGIN
      ) {
        // 其他接口code错误
        track({
          t: "requestCodeError",
          rc: httpCode, // 请求状态码
          rt, // 接口耗时
          ru: res.config.url, // 请求的地址
          ec: resultCode, // 后端返回的code
          em: res.data.msg || res.data.message, // 后端返回的错误信息
          c: JSON.stringify({
            method: res.config.method, // 请求方式
            data: res.config.data, // 请求参数
            params: res.config.params, // 请求参数
          }),
        });
      } else if (rt > 2000 && resultCode === statusMap.SUCCESS) {
        // 接口超时，用时超过2s
        track({
          t: "request",
          rc: httpCode, // 请求状态码
          rt, // 接口耗时
          ru: res.config.url, // 请求的地址
          ec: resultCode, // 后端返回的code
          c: JSON.stringify({
            method: res.config.method, // 请求方式
            data: res.config.data, // 请求参数
            params: res.config.params, // 请求参数
          }),
        });
      }
    }
  }
  if (type === "resolve") {
    return res;
  }
  return Promise.reject(res);
};
